import CONFIG from "../config";
/**
 * WGT更新包下载与安装
 * @param {Array} urls - 下载地址列表（优先使用第一个）
 * @param {Function} onProgress - 进度回调（0-100）
 * @param {Function} onComplete - 完成回调
 * @param {Function} onError - 错误回调
 */
export function downloadAndInstallWgt(urls, onProgress, onComplete, onError) {
  // 前置校验：确保回调函数存在（避免调用undefined报错）
  if (
    typeof onProgress !== "function" ||
    typeof onComplete !== "function" ||
    typeof onError !== "function"
  ) {
    console.error("【更新工具】WGT更新：回调函数必须为Function类型");
    return;
  }
  // 1. 增强入参校验：避免非数组/空地址/无效URL
  if (!urls || !Array.isArray(urls) || urls.length === 0) {
    onError(new Error("无效的WGT下载地址（需非空数组）"));
    return;
  }
  const downloadUrl = urls[0];
  if (
    !downloadUrl ||
    typeof downloadUrl !== "string" ||
    !downloadUrl.startsWith("http")
  ) {
    onError(new Error(`WGT下载地址无效：${downloadUrl || "空地址"}`));
    return;
  }
  // 2. 环境校验：确保plus环境存在（避免非App端调用报错）
  if (
    typeof plus === "undefined" ||
    !plus.downloader ||
    !plus.io ||
    !plus.runtime
  ) {
    onError(new Error("仅App端支持WGT更新功能"));
    return;
  }

  let downloadTask = null;

  // 3. 确保下载目录存在（避免首次更新目录不存在导致失败）
  function ensureDir(dirPath) {
    return new Promise((resolve) => {
      plus.io.resolveLocalFileSystemURL(
        dirPath,
        () => resolve(true), // 目录已存在
        (err) => {
          // 递归创建目录（_doc/update/wgt/）
          plus.io.requestFileSystem(
            plus.io.PRIVATE_DOC,
            (fs) => {
              const parts = dirPath
                .replace(/^_doc\//, "")
                .split("/")
                .filter((p) => p);
              let currentDir = fs.root;

              function createDir(index) {
                if (index >= parts.length) {
                  resolve(true);
                  return;
                }
                currentDir.getDirectory(
                  parts[index],
                  { create: true, exclusive: false },
                  (dir) => {
                    currentDir = dir;
                    createDir(index + 1);
                  },
                  () => resolve(false)
                );
              }
              createDir(0);
            },
            () => resolve(false)
          ); // 文件系统请求失败
        }
      );
    });
  }

  // 4. 异步流程改用async/await（避免Promise嵌套报错）
  async function startDownload() {
    try {
      // 先确保目录存在
      const dirCreated = await ensureDir("_doc/update/wgt/");
      if (!dirCreated) {
        onError(new Error("无法创建WGT下载目录，请检查存储权限"));
        return;
      }

      // 创建下载任务（保留原逻辑）
      downloadTask = plus.downloader.createDownload(
        downloadUrl,
        { filename: "_doc/update/wgt/" }, // 下载到应用私有目录
        (download, status) => {
          if (status === 200) {
            console.log(
              "【更新工具】WGT下载完成，开始安装：",
              download.filename
            );
            // 安装WGT包
            plus.runtime.install(
              download.filename,
              { force: false },
              () => {
                console.log("【更新工具】WGT安装成功");
                // 安装成功后清理安装包
                plus.io.resolveLocalFileSystemURL(
                  download.filename,
                  (entry) => {
                    entry.remove(
                      () => console.log("【更新工具】WGT安装包已清理"),
                      () => {}
                    );
                  }
                );
                // 关键修复：WGT安装完成后不主动提示重启（由调用方控制）
                onComplete();
              },
              (err) => {
                const errMsg = `安装失败（${err.code}）：${err.message}`;
                console.error("【更新工具】WGT安装失败：", errMsg);
                // 清理失败的安装包
                plus.io.resolveLocalFileSystemURL(
                  download.filename,
                  (entry) => {
                    entry.remove(
                      () => {},
                      () => {}
                    );
                  }
                );
                onError(new Error(errMsg));
              }
            );
          } else {
            const errMsg = `下载失败，状态码：${status}（地址：${downloadUrl}）`;
            console.error("【更新工具】WGT下载失败：", errMsg);
            onError(new Error(errMsg));
          }
        }
      );

      // 5. 优化进度计算：处理totalSize为0的边界情况（避免NaN）
      downloadTask.addEventListener("statechanged", (download) => {
        if (download.state === 3) {
          // 下载中
          const totalSize = download.totalSize || 0;
          const downloadedSize = download.downloadedSize || 0;
          // 确保进度在0-100范围内
          const progress =
            totalSize > 0
              ? Math.max(
                  0,
                  Math.min(100, Math.floor((downloadedSize / totalSize) * 100))
                )
              : 0;
          onProgress(progress);
        }
      });

      // 开始下载
      downloadTask.start();
    } catch (err) {
      console.error("【更新工具】WGT下载异常：", err);
      if (downloadTask) downloadTask.abort();
      onError(new Error(`下载异常：${err.message}`));
    }
  }

  // 启动下载流程
  startDownload();
}

/**
 * APK更新包下载与安装（仅Android）
 * @param {Array} urls - 下载地址列表（优先使用第一个）
 * @param {Function} onProgress - 进度回调（0-100）
 * @param {Function} onComplete - 完成回调
 * @param {Function} onError - 错误回调
 */
export function downloadAndInstallApk(urls, onProgress, onComplete, onError) {
  // 前置校验：确保回调函数存在
  if (
    typeof onProgress !== "function" ||
    typeof onComplete !== "function" ||
    typeof onError !== "function"
  ) {
    console.error("【更新工具】APK更新：回调函数必须为Function类型");
    return;
  }
  // 1. 增强入参校验
  if (!urls || !Array.isArray(urls) || urls.length === 0) {
    onError(new Error("无效的APK下载地址（需非空数组）"));
    return;
  }
  const downloadUrl = urls[0];
  if (
    !downloadUrl ||
    typeof downloadUrl !== "string" ||
    !downloadUrl.startsWith("http")
  ) {
    onError(new Error(`APK下载地址无效：${downloadUrl || "空地址"}`));
    return;
  }
  // 2. 环境校验：确保plus环境存在
  if (
    typeof plus === "undefined" ||
    !plus.downloader ||
    !plus.io ||
    !plus.os ||
    !plus.runtime
  ) {
    onError(new Error("仅App端支持APK更新功能"));
    return;
  }
  // iOS不支持直接安装APK（保留原逻辑）
  if (plus.os.name !== "Android") {
    onError(new Error("iOS平台请通过应用商店更新"));
    return;
  }

  let downloadTask = null;

  // 3. 确保下载目录存在
  function ensureDir(dirPath) {
    return new Promise((resolve) => {
      plus.io.resolveLocalFileSystemURL(
        dirPath,
        () => resolve(true),
        (err) => {
          plus.io.requestFileSystem(
            plus.io.PRIVATE_DOC,
            (fs) => {
              const parts = dirPath
                .replace(/^_doc\//, "")
                .split("/")
                .filter((p) => p);
              let currentDir = fs.root;

              function createDir(index) {
                if (index >= parts.length) {
                  resolve(true);
                  return;
                }
                currentDir.getDirectory(
                  parts[index],
                  { create: true, exclusive: false },
                  (dir) => {
                    currentDir = dir;
                    createDir(index + 1);
                  },
                  () => resolve(false)
                );
              }
              createDir(0);
            },
            () => resolve(false)
          ); // 文件系统请求失败
        }
      );
    });
  }

  // 4. 异步流程改用async/await（避免Promise嵌套报错）
  async function startDownload() {
    try {
      // 先确保目录存在
      const dirCreated = await ensureDir("_doc/update/apk/");
      if (!dirCreated) {
        onError(new Error("无法创建APK下载目录，请检查存储权限"));
        return;
      }

      // 创建下载任务（保留原逻辑）
      downloadTask = plus.downloader.createDownload(
        downloadUrl,
        { filename: "_doc/update/apk/" }, // 下载到应用私有目录
        (download, status) => {
          if (status === 200) {
            console.log(
              "【更新工具】APK下载完成，开始安装：",
              download.filename
            );

            // 4. 新增：校验APK文件大小（避免空文件/损坏文件）
            plus.io.resolveLocalFileSystemURL(download.filename, (entry) => {
              entry.getMetadata(
                (meta) => {
                  if (meta.size < 1024 * 1024) {
                    // 小于1MB视为无效
                    entry.remove();
                    onError(
                      new Error(
                        `APK文件无效（大小：${(meta.size / 1024).toFixed(
                          2
                        )}KB）`
                      )
                    );
                    return;
                  }

                  // 安装APK（保留原逻辑，补充Android 7.0+提示）
                  plus.runtime.install(
                    download.filename,
                    { force: false },
                    () => {
                      console.log("【更新工具】APK安装成功");
                      // 安装成功后清理安装包
                      plus.io.resolveLocalFileSystemURL(
                        download.filename,
                        (entry) => {
                          entry.remove(
                            () => console.log("【更新工具】APK安装包已清理"),
                            () => {}
                          );
                        }
                      );
                      // 关键修复：APK安装完成后仅提示“安装完成”，不提示重启（手动安装后用户自行重启）
                      onComplete();
                    },
                    (err) => {
                      let errMsg = `安装失败（${err.code}）：${err.message}`;
                      // 针对性提示：Android 7.0+ FileProvider配置问题
                      if (err.code === 20) {
                        errMsg += "，请配置FileProvider以支持Android 7.0+安装";
                      }
                      console.error("【更新工具】APK安装失败：", errMsg);
                      // 清理失败的安装包
                      plus.io.resolveLocalFileSystemURL(
                        download.filename,
                        (entry) => {
                          entry.remove(
                            () => {},
                            () => {}
                          );
                        }
                      );
                      onError(new Error(errMsg));
                    }
                  );
                },
                (metaErr) => {
                  onError(new Error(`APK文件校验失败：${metaErr.message}`));
                }
              );
            });
          } else {
            const errMsg = `下载失败，状态码：${status}（地址：${downloadUrl}）`;
            console.error("【更新工具】APK下载失败：", errMsg);
            onError(new Error(errMsg));
          }
        }
      );

      // 5. 优化进度计算：处理totalSize为0的边界情况
      downloadTask.addEventListener("statechanged", (download) => {
        if (download.state === 3) {
          // 下载中
          const totalSize = download.totalSize || 0;
          const downloadedSize = download.downloadedSize || 0;
          const progress =
            totalSize > 0
              ? Math.max(
                  0,
                  Math.min(100, Math.floor((downloadedSize / totalSize) * 100))
                )
              : 0;
          onProgress(progress);
        }
      });

      // 开始下载
      downloadTask.start();
    } catch (err) {
      console.error("【更新工具】APK下载异常：", err);
      if (downloadTask) downloadTask.abort();
      onError(new Error(`下载异常：${err.message}`));
    }
  }

  // 启动下载流程
  startDownload();
}

/**
 * 打开应用商店（iOS/Android通用）
 * @param {Function} [onError] - 错误回调（可选）
 */
export function openAppStore(onError) {
  if (typeof plus === "undefined" || !plus.runtime || !plus.os) {
    const errMsg = "仅App端支持应用商店跳转功能";
    console.error(`【更新工具】${errMsg}`);
    typeof onError === "function" && onError(new Error(errMsg));
    uni.showToast({ title: errMsg, icon: "none", duration: 2000 });
    return;
  }

  const { iosAppId, androidAppId } = CONFIG;
  let storeUrl = "";

  if (plus.os.name === "iOS") {
    if (!iosAppId || !/^\d+$/.test(iosAppId)) {
      const errMsg = "iOS 应用商店 ID 配置错误（需纯数字）";
      console.warn(`【更新工具】${errMsg}`);
      typeof onError === "function" && onError(new Error(errMsg));
      uni.showToast({ title: errMsg, icon: "none", duration: 2000 });
      return;
    }
    storeUrl = `itms-apps://itunes.apple.com/cn/app/id${iosAppId}?mt=8`;
  } else {
    if (!androidAppId) {
      const errMsg = "Android 包名未配置";
      console.warn(`【更新工具】${errMsg}`);
      typeof onError === "function" && onError(new Error(errMsg));
      uni.showToast({ title: errMsg, icon: "none", duration: 2000 });
      return;
    }
    storeUrl = `market://details?id=${androidAppId}`;
  }

  console.log("【更新工具】跳转应用商店：", storeUrl);
  plus.runtime.openURL(
    storeUrl,
    () => console.log("【更新工具】应用商店跳转成功"),
    (err) => {
      const errMsg = `打开应用商店失败：${err.message}`;
      console.error(`【更新工具】${errMsg}`);
      typeof onError === "function" && onError(new Error(errMsg));
      uni.showToast({
        title: "打开应用商店失败，请手动搜索",
        icon: "none",
        duration: 2000
      });
    }
  );
}
